//
// Created by Lenovo on 2021/12/19.
//

#ifndef LINEAR_CIRCULATIONLINKLIST_LINEAR_CIRCULATIONLINKLIST_H
#define LINEAR_CIRCULATIONLINKLIST_LINEAR_CIRCULATIONLINKLIST_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

enum Status{OK=1,ERROR=-2,TRUE=1,FALSE=0,EMPTY=-1};

typedef int ElemType;

typedef struct LNode{//结点类型
    ElemType * data;
    struct LNode * next;
}LNode;

typedef struct LinkList{//链表类型
    LNode* head;
    LNode* tail;
    int ListSize;
}LinkList;

typedef enum Status Status;

Status ListInit(LinkList* L);//链表初始化
Status DestroyList(LinkList* L);//链表销毁
Status ClearList(LinkList* L);//清空链表
Status InsertFirst(LinkList* L,LNode s);//在第一个节点前插入
LNode  DestroyFirst(LinkList* L);//销毁第一个节点
Status Append(LinkList* LH,LinkList* LT);//将两个链表链接
LNode  RemoveTail(LinkList* L);//移除最后一个节点
Status InsertBefore(LinkList* L,LNode* p,LNode s);//在p所指向的节点前插入
Status InsertAfter(LinkList* L,LNode* p,LNode s);//在p所指向的节点后插入
Status SetCurElem(LNode* p,ElemType e);//设置p所指向的节点的值
ElemType GetCurElem(LNode p);//获取p所指向的节点的值
Status ListEmpty(LinkList L);//判断链表是否为空
int ListLength(LinkList L);//获取链表长度
LNode* GetHead(LinkList L);//获取头节点
LNode* GetLast(LinkList L);//获取尾节点
LNode* NextPos(LinkList L,LNode* p);//获取p所指向节点的下一个节点
LNode* PriorPos(LinkList L,LNode* p);//获取p所指下一个节点
LNode* LocatePos(LinkList L,int i);//获取第i个节点
LNode* LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType));//获取元素e的位置
Status ListTraverse(LinkList L,Status (*visit)(LNode* ));//链表遍历
Status ListInsert_L(LinkList* L,int i,LNode s);//在第i个节点前插入e
Status ListPushHead(LinkList* L,LNode s);//链表尾插
Status LNodeInit(LNode* l);//节点初始化



ElemType* CreatElem(int data);//创造一个元素
Status List_Sort(LinkList* L,Status (*compare)(ElemType e,ElemType f));//对链表进行既定顺序的排序
Status ListSelectSort(LinkList* L,Status (*compare)(ElemType e,ElemType f));//对链表进行既定顺序的选择排序

Status ListRevers(LinkList* L);//链表的原地逆置

#endif //LINEAR_CIRCULATIONLINKLIST_LINEAR_CIRCULATIONLINKLIST_H
